home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / utils / monoware.arc / MONOWARE.S < prev   
Text File  |  1985-11-20  |  11KB  |  373 lines

  1. ; The Mono Emulator. By Mick West.  September 1987.
  2.  
  3. ; Routine to make the ST think it is in mono mode. Needs TOS in ROM
  4. ; Makes the system think that there is a mono screen, but actually
  5. ; be updating a medium real screen from this under Vblank interrupt
  6. ; The XBIOS calls; Physbase,Setscreen and Getrez are revectored.
  7.  
  8. START:
  9.  MOVE.L #MESSAGE,-(SP)
  10.  MOVE.W #9,-(SP)                ; Print startup message
  11.  TRAP #1
  12.  ADDQ.L #6,SP
  13.  
  14. INLOOP:
  15.  MOVE.L #INPUT,-(SP)
  16.  MOVE.W #9,-(SP)                ; Print input message
  17.  TRAP #1
  18.  ADDQ.L #6,SP
  19.  MOVE.B #3,MESSAGE              ; Input length = 3
  20.  MOVE.L #MESSAGE,-(SP)
  21.  MOVE.W #10,-(SP)
  22.  TRAP #1                        ; Input number
  23.  ADDQ.L #6,SP
  24.  MOVE.W #40,D0                  ; Default = 40
  25.  TST.B MESSAGE+1
  26.  BEQ DEFAULT                    ; If len=0
  27.  CMP.B #1,MESSAGE+1             ; len of 1 not allowed
  28.  BEQ INLOOP
  29.  CLR.W D0
  30.  MOVE.B MESSAGE+2,D0            ; first digit
  31.  SUB.W #48,D0
  32.  BLE INLOOP                     ; Too low
  33.  CMP.W #9,D0
  34.  BGT INLOOP                     ; Too High (>100)
  35.  MULU #10,D0
  36.  CLR.W D1
  37.  MOVE.B MESSAGE+3,D1            ; second digit
  38.  SUB.W #48,D1
  39.  BLT INLOOP                     ; Too low
  40.  CMP.W #9,D1
  41.  BGT INLOOP                     ; Too high
  42.  ADD.W D1,D0
  43.  CMP.W #80,D0
  44.  BGT INLOOP                     ; Check less than 80
  45. DEFAULT:
  46.  MOVE.W D0,SCANPOKE+2
  47.  
  48.  
  49.  CLR.L -(SP)
  50.  MOVE.W #32,-(SP)
  51.  TRAP #1                        ; ENTER SUPER MODE
  52.  ADDQ.L #6,SP
  53.  
  54.  MOVE.W  #$2700,SR              ; Normal ROM reset routine starts here
  55.  RESET
  56.  CMP.L   #$FA52235F,$FA0000.L
  57.  BNE     FC003C
  58.  LEA     FC003C,A6
  59.  JMP     $FA0004.L
  60. FC003C:
  61.  LEA     FC0044,A6
  62.  JMP     $FC05D8
  63. FC0044:
  64.  BNE     FC0050
  65.  MOVE.B  $000424.L,$FF8001.L
  66. FC0050:
  67.  SUB.L   A5,A5
  68.  CMP.L   #$31415926,$0426(A5)
  69.  BNE     FC0074
  70.  MOVE.L  $042A(A5),D0
  71.  TST.B   $042A(A5)
  72.  BNE     FC0074
  73.  BTST    #$0000,D0
  74.  BNE     FC0074
  75.  MOVE.L  D0,A0
  76.  LEA     FC0050,A6
  77.  JMP     (A0)
  78. FC0074:
  79.  LEA     $FF8800.L,A0
  80.  MOVE.B  #$0007,(A0)
  81.  MOVE.B  #$00C0,$0002(A0)
  82.  MOVE.B  #$000E,(A0)
  83.  MOVE.B  #$0007,$0002(A0)
  84.  BTST    #$0000,$FC001D
  85.  BEQ     FC00A6
  86.  LEA     FC009E,A6
  87.  JMP     $FC0CE4
  88. FC009E:
  89.  MOVE.B  #$0002,$FF820A.L
  90. FC00A6:
  91.  MOVE.B  #$0001,$FF8201.L
  92.  MOVE.B  #$0000,$FF8203.L
  93.  SUB.L   A5,A5
  94. ; Memory sizing missed out
  95.  MOVE.W  #$093A,A0
  96.  MOVE.L  #$00010000,A1
  97.  MOVEQ   #$00,D0
  98. FC01D0:
  99.  MOVE.W  D0,(A0)+
  100.  CMP.L   A0,A1
  101.  BNE     FC01D0
  102. ;
  103. ; SCREEN SET UP HERE
  104. ;
  105.  MOVE.L  $042E(A5),A0           ; Phystop of RAM
  106.  SUB.L   #$00008000,A0          ; less 32K
  107.  MOVE.L  A0,$044E(A5)           ; is the Physbase of screen
  108.  MOVE.L  A0,MED+SPACE           ; Set MED
  109.  MOVE.B  $044F(A5),$FF8201.L    ; configure hardware addr
  110.  MOVE.B  $0450(A5),$FF8203.L
  111.  MOVE.W  #$0777,$FF8240         ; White background
  112.  MOVE.W  #$0000,$FF8246         ; Black ink for double line
  113.  MOVE.W  #$07FF,D1
  114. FC01F8:
  115.  MOVE.L  D0,(A0)+
  116.  MOVE.L  D0,(A0)+
  117.  MOVE.L  D0,(A0)+
  118.  MOVE.L  D0,(A0)+
  119.  DBF     D1,FC01F8              ; clear the screen
  120.  MOVE.L $044E(A5),A0
  121.  SUB.L #$8000,A0                ; Reserve another 32k
  122.  MOVE.L A0,$044E(A5)            ; For the mono screen
  123.  MOVE.L A0,MONO+SPACE           ; Set MONO
  124.  MOVE.L  $FC0014,A0
  125.  CMP.L   #$87654321,(A0)
  126.  BEQ     FC0214
  127.  LEA     $FC0008,A0
  128. FC0214:
  129.  MOVE.L  $0004(A0),$0004FA.L
  130.  MOVE.L  $0008(A0),$0004FE.L
  131.  MOVE.L  #$00FC0D60,$046A(A5)
  132.  MOVE.L  #$00FC10D2,$0476(A5)
  133.  MOVE.L  #$00FC0DE6,$0472(A5)
  134.  MOVE.L  #$00FC0F96,$047E(A5)
  135.  MOVE.L  #$00FC137C,$047A(A5)
  136.  MOVE.L  #$00FC1F34,$0506(A5)
  137.  MOVE.L  #$00FC1EA0,$050A(A5)
  138.  MOVE.L  #$00FC1F6E,$050E(A5)
  139.  MOVE.L  #$00FC1F86,$0512(A5)
  140.  MOVE.L  #$00FC0C2C,$0502(A5)
  141.  
  142.  MOVE.L  $044E(A5),$0436(A5)    ; Memtop = Physbase
  143.  SUB.L   #$400,$0436(A5)        ;          minus 1k
  144.  
  145.  MOVE.L  $04FA(A5),$0432(A5)
  146.  LEA     $004DB8.L,A7
  147.  MOVE.W  #$0008,$0454(A5)
  148.  ST      $0444(A5)
  149.  MOVE.W  #$0003,$0440(A5)
  150.  MOVE.L  #$0000167A,$04C6(A5)
  151.  MOVE.W  #$FFFF,$04EE(A5)
  152.  MOVE.L  #$00FC0000,$04F2(A5)
  153.  MOVE.L  #$0000093A,$04A2(A5)
  154.  MOVE.L  #$00FC05C0,$046E(A5)
  155.  LEA     $FC0724,A3
  156.  LEA     $FC05C0,A4
  157.  CMP.L   #$FA52235F,$FA0000.L
  158.  BEQ     FC02F6
  159.  LEA     $FC0A1A,A1
  160.  ADD.L   #$02000000,A1
  161.  LEA     $000008.L,A0
  162.  MOVE.W  #$003D,D0
  163. FC02E4:
  164.  MOVE.L  A1,(A0)+
  165.  ADD.L   #$01000000,A1
  166.  DBF     D0,FC02E4
  167.  MOVE.L  A3,$000014.L
  168. FC02F6:
  169.  MOVE.L  #$00FC061E,$0068(A5)
  170.  MOVE.L  A3,$0088(A5)
  171.  MOVE.L  #$00FC074E,$00B4(A5)
  172.  MOVE.L  #$00FC9C48,$0028(A5)
  173.  MOVE.L  A4,$0400(A5)
  174.  MOVE.L  #$00FC0744,$0404(A5)
  175.  MOVE.L  A4,$0408(A5)
  176.  
  177.  MOVE.L $0436(A5),A0
  178.  ADD.L #SPACE-XBIOS,A0
  179.  MOVE.L A0,POKE1+2              ; SPACE ADDR
  180.  MOVE.L A0,POKE2+2              ; IN BOTH ROUTINES
  181.  MOVE.L #0,MONOPOS+SPACE        ; SET FLY TO TOP OF SCREEN
  182. SCANPOKE:
  183.  MOVE.W #40,MONOLINES+SPACE     ; FORTY LINES/VBLAN DEFAULT
  184.  MOVE.W #0,MONOCOUNT+SPACE      ; NONE DONE YET
  185.  MOVE.L $0436(A5),A2            ; Get Memtop
  186.  MOVE.L #XBIOS,A1               ; NOW MOVE THE
  187.  MOVE.W #XEND-XBIOS-1,D0        ; CODE FOR XBIOS & VBLANK
  188. XMOVE:                          
  189.  MOVE.B (A1)+,(A2)+
  190.  DBF D0,XMOVE
  191.  LEA GEN,A1                     ; Generate the move code
  192.  MOVE.W #39,D0                  ; 40 MOVE's  to the first plane
  193. GENMOVE1:
  194.  MOVE.L (A1),(A2)+
  195.  DBF D0,GENMOVE1
  196.  ADDQ.L #4,A1
  197.  MOVE.W (A1)+,(A2)+             ; Move the SUB #158,A0
  198.  MOVE.L (A1)+,(A2)+
  199.  MOVE.W #39,D0                  ; 40 MOVE's to the other plane
  200. GENMOVE2:
  201.  MOVE.L (A1),(A2)+
  202.  DBF D0,GENMOVE2
  203.  ADDQ.L #4,A1
  204.  MOVE.W (A1),(A2)+              ; Move the RTS
  205.  
  206.  MOVE.L $0436(A5),A0
  207.  MOVE.L A0,$B8                  ; New XBIOS  Vector  to $B8
  208.  ADD.L #VBLANK-XBIOS,A0
  209.  MOVE.L A0,$70                  ; New VBLANK Vector  to $70
  210.  LEA     $04CE(A5),A0
  211.  MOVE.L  A0,$0456(A5)
  212.  MOVE.W  #$0007,D0
  213. FC033E:
  214.  CLR.L   (A0)+
  215.  DBF     D0,FC033E
  216.  JSR     $FC21B4
  217.  MOVEQ   #$02,D0
  218.  JSR     $FC0596
  219. FC0360:
  220.  LEA     FC0376,A6
  221.  JMP     $FC0CE4                ; Wait for fly
  222. FC0376:
  223.  MOVE.B  #$0001,$FF8260.L       ; Hardware to medium
  224.  MOVE.B  #$0002,$00044C.L       ; software to mono
  225. FC0386:
  226.  JSR     $FCA76A.L
  227. FC03A0:
  228.  JMP $FC03A8                    ; Jump back into ROM
  229.  
  230.  
  231. XBIOS:                          
  232.  MOVEM.L A1/A2,-(SP)
  233. POKE1:
  234.  MOVE.L #0,A1
  235.  MOVE.L SP,A2                   ; A2=STACK
  236.  ADD.L #8,A2                    ; SKIP A1/A2
  237.  BTST #5,(A2)                   ; IF CALLED FROM USER MODE
  238.  BNE NOTUSER                    ; THEN
  239.  MOVE.L USP,A2                  ; GET THE USER STACK
  240.  SUB.L #6,A2                    ; OFFSET AS SUPER STACK
  241. NOTUSER:
  242.  MOVE.W $6(A2),D0               ; GET CODE
  243.  CMP.W #2,D0                    ; CHECK FOR PHYSBASE CODE
  244.  BEQ PHYSBASE                   ; JUMP TO NEW PHYSBASE ROUTINE
  245.  CMP.W #4,D0                    ; CHECK FOR GETREZ CODE
  246.  BEQ GETREZ                     ; JUMP TO NEW GETREZ ROUTINE
  247.  CMP.W #5,D0                    ; CHECK FOR SETSCREEN CODE
  248.  BNE NORM_XBIOS                 ; NOTHING NEEDS CHANGING SO NORMAL XBIOS
  249.  MOVE.W #-1,16(A2)              ; NO CHANGE TO RESOLUTION
  250.  MOVE.L 12(A2),D0               ; GET NEW PHYS
  251.  CMP.L #-1,D0                   ; IF NEGATIVE
  252.  BEQ NORM_XBIOS                 ; THEN NO CHANGE
  253.  MOVE.L D0,MONO(A1)             ; NEW BASE FOR MONO
  254.  MOVE.L #-1,12(A2)              ; SET TO NO CHANGE
  255.  BRA NORM_XBIOS                 ; AND CONTINUE WITH NORMAL XBIOS
  256. PHYSBASE:
  257.  MOVE.L MONO(A1),D0             ; GET MONO ADDR
  258.  MOVEM.L (SP)+,A1/A2
  259.  RTE                            ; AND RETURN IT AS 'REAL' SCREEN
  260. GETREZ:
  261.  MOVE.W #2,D0                   ; RETURN MONO RESOLUTION
  262.  MOVEM.L (SP)+,A1/A2
  263.  RTE
  264. NORM_XBIOS:
  265.  MOVEM.L (SP)+,A1/A2
  266.  JMP $FC0748                    ; JUMP INTO THE NORMAL XBIOS ROUTINE
  267.  
  268. VBLANK: 
  269.  MOVEM.L D0-D7/A0-A6,-(SP)
  270.  MOVE.W #$333,$FF8242           ; Grey for the single width lines
  271.  MOVE.W #$333,$FF8244           ; For 01 and 10
  272.  BTST #0,$FF8240                ; Check inverted
  273.  BEQ INVERT                     ; Jump if so
  274.  MOVE.W #$777,$FF8240           ; White background
  275.  MOVE.W #$000,$FF8246           ; Black ink
  276.  BRA POKE2
  277. INVERT:
  278.  MOVE.W #$000,$FF8240           ; Black background
  279.  MOVE.W #$777,$FF8246           ; White ink
  280. POKE2:
  281.  MOVE.L #0,A5